﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Jardin_Informativo_Agua_Tierra
{
    public partial class Stock : Form
    {
        public Stock()
        {
            InitializeComponent();
        }

        JardinInformativoBDEntities BEDE = new JardinInformativoBDEntities();
        IEnumerable<Recurso> ListaRecursos;
        Validacion v = new Validacion();
        Generador g = new Generador();

        int valtipo;
        int valnombre;

        int valrecurso;
        int valtrabajador;
        int valobservacion;

        private void LlenarExistencias()
        {
            dgv_Recursos.Rows.Clear();
            ListaRecursos = BEDE.Recurso.OrderBy(c => c.cod_recurso);
            foreach (Recurso aux in ListaRecursos)
            {
                string tipo = "";
                if(aux.tipo_recurso == 1) { tipo = "FUNJIBLE"; } else { if(aux.tipo_recurso == 2) { tipo = "DIDACTICO";}}
                dgv_Recursos.Rows.Add(aux.cod_recurso.ToString(), aux.nombre.ToString(), tipo.ToString(), aux.cant_disponible.ToString());
            }
        }

        private void ListarRecursos()
        {
            //cbx_RecursosFunjibles.Items.Clear();
            ListaRecursos = BEDE.Recurso.Where(c => c.tipo_recurso == 1).OrderBy(c => c.nombre);
            cbx_RecursosFunjibles.DataSource = ListaRecursos;
            cbx_RecursosFunjibles.DisplayMember = "nombre";
            cbx_RecursosFunjibles.ValueMember = "cod_recurso";
            cbx_RecursosFunjibles.SelectedIndex = -1;
        }

        private void Stock_Load(object sender, EventArgs e)
        {
            LlenarExistencias();
            btn_RegistrarConsumo.Enabled = false;
            btn_DescartarConsumo.Enabled = false;
            Nud2_Cantidad.Value = 1;
            try
            {
                cbx_RecursoAñadir.DataSource = BEDE.Recurso.OrderBy(c => c.cod_recurso);
                cbx_RecursoAñadir.DisplayMember = "nombre";
                cbx_RecursoAñadir.ValueMember = "cod_recurso";
                cbx_RecursoAñadir.SelectedIndex = -1;
            }
            catch { }
            ListarRecursos();
            try
            {
                cbx_Trabajador.DataSource = BEDE.Trabajador.Where(c => c.cod_cargo > 1).OrderBy(c => c.nombre);
                cbx_Trabajador.DisplayMember = "nombre";
                cbx_Trabajador.ValueMember = "rut";
                cbx_Trabajador.SelectedIndex = -1;
            }
            catch { }
        }

        private void btn_AñadirRecursos_Click(object sender, EventArgs e)
        {
            cbx_Tipo.Focus();
            cbx_RecursoAñadir.Focus();
            btn_AñadirRecursos.Focus();
            errorProvider1.SetError(lbl_Trabajador, "");
            errorProvider1.SetError(lbl_Rec, "");
            int valido = valnombre * valtipo;
            if (valido == 0) { MessageBox.Show("No se ha podido agregar el recurso descrito, pues se ingresaron datos erroneos. Revise y corrija los campos señalados, y vuelva a intentarlo.", "ERROR DE DATOS", MessageBoxButtons.OK, MessageBoxIcon.Error); }
            else
            {
                try
                {
                    int r = int.Parse(cbx_RecursoAñadir.SelectedValue.ToString());
                    Recurso aux = BEDE.Recurso.Single(c => c.cod_recurso == r);
                    aux.cant_disponible += int.Parse(Nud_CantidadAñadir.Value.ToString());
                    BEDE.SaveChanges();
                    LlenarExistencias();
                    cbx_Tipo.SelectedIndex = -1;
                    cbx_RecursoAñadir.SelectedIndex = -1;
                    Nud_CantidadAñadir.Value = 1;
                    MessageBox.Show("Las unidades del recurso indicado se añadieron correctamente al stock.", "UNIDADES AÑADIDAS.", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch
                {
                    Recurso RR = new Recurso();
                    int a = g.GenCodRecurso();
                    RR.cod_recurso = a;
                    RR.tipo_recurso = cbx_Tipo.SelectedIndex + 1;
                    RR.nombre = cbx_RecursoAñadir.Text;
                    RR.cant_disponible = int.Parse(Nud_CantidadAñadir.Value.ToString());
                    BEDE.Recurso.AddObject(RR);
                    BEDE.SaveChanges();
                    LlenarExistencias();
                    cbx_Tipo.SelectedIndex = -1;
                    cbx_RecursoAñadir.SelectedIndex = -1;
                    Nud_CantidadAñadir.Value = 1;
                    MessageBox.Show("El recurso descrito fue correctamente añadido a las existencias.", "RECURSO AÑADIDO.", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                ListarRecursos();
            }
        }

        private void cbx_Tipo_Leave(object sender, EventArgs e)
        {
            valtipo = v.ValidarCombobox(cbx_Tipo.Text);
            if (valtipo == 0) { errorProvider1.SetError(lbl_Tipo, "Debe escoger un tipo de recurso."); }
            else { errorProvider1.SetError(lbl_Tipo, ""); }
        }

        private void cbx_RecursoAñadir_Leave(object sender, EventArgs e)
        {
            cbx_RecursoAñadir.Text = cbx_RecursoAñadir.Text.Trim();
            string a = cbx_RecursoAñadir.Text.ToUpper();
            cbx_RecursoAñadir.Text = a;
            valnombre = v.ValidarTextos(cbx_RecursoAñadir.Text);
            if (valnombre == 0) { errorProvider1.SetError(lbl_NomRecurso, "Este campo solo admite caracteres entre la A y la Z, además de espacios.\nEste Campo no puede quedar vacío."); }
            else { errorProvider1.SetError(lbl_NomRecurso, ""); }
        }

        private void cbx_RecursosFunjibles_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cbx_RecursosFunjibles.SelectedIndex != -1)
            {
                int a = ((Recurso)cbx_RecursosFunjibles.SelectedItem).cant_disponible;
                int b = ((Recurso)cbx_RecursosFunjibles.SelectedItem).cod_recurso;
                int c = 0;
                foreach(DataGridViewRow dgvr in dgv_DetalleConsumo.Rows)
                {
                    if (int.Parse(dgvr.Cells[0].Value.ToString()) == b) { c += int.Parse(dgvr.Cells[2].Value.ToString()); }
                }
                Nud2_Cantidad.Maximum = a - c;
                if (Nud2_Cantidad.Maximum == 0) { btn_SumarAlConsumo.Enabled = false; } else { btn_SumarAlConsumo.Enabled = true; }
            }
        }

        private void cbx_RecursosFunjibles_Leave(object sender, EventArgs e)
        {
            valrecurso = v.ValidarCombobox(cbx_RecursosFunjibles.Text);
            if(valrecurso == 0){errorProvider1.SetError(lbl_Rec, "Debe seleccionar alguno de los recursos.");}
            else{errorProvider1.SetError(lbl_Rec, "");}
        }

        private void cbx_Trabajador_Leave(object sender, EventArgs e)
        {
            valtrabajador = v.ValidarCombobox(cbx_Trabajador.Text);
            if (valtrabajador == 0) { errorProvider1.SetError(lbl_Trabajador, "Debe seleccionar un trabajador de la lista."); }
            else { errorProvider1.SetError(lbl_Trabajador, ""); }
        }

        private void tbx_Observaciones_Leave(object sender, EventArgs e)
        {
            tbx_Observaciones.Text = tbx_Observaciones.Text.Trim();
            if (tbx_Observaciones.Text != "")
            {
                valobservacion = v.ValidarDescripciones(tbx_Observaciones.Text);
                if (valobservacion == 0) { errorProvider1.SetError(lbl_Obs, "Revise la descripcion ingresada. Se reconoce un error en su sintaxis."); }
                else { errorProvider1.SetError(lbl_Obs, ""); }
            }
            else { valobservacion = 1; errorProvider1.SetError(lbl_Obs, ""); }
        }

        private void btn_SumarAlConsumo_Click(object sender, EventArgs e)
        {
            
            cbx_RecursosFunjibles.Focus();
            cbx_Trabajador.Focus();
            tbx_Observaciones.Focus();
            btn_SumarAlConsumo.Focus();

            int seguir = valrecurso * valtrabajador * valobservacion;
            if (seguir == 0) { MessageBox.Show("No se puede añadir el recurso al consumo en curso, pues existen error en los datos ingresados. Revise y corrija los campos señalados, y repita el intento de añadir.", "ERROR DE DATOS.", MessageBoxButtons.OK, MessageBoxIcon.Error); }
            else 
            {
                int ee = 0;
                int a = int.Parse(cbx_RecursosFunjibles.SelectedValue.ToString());
                foreach (DataGridViewRow aa in dgv_DetalleConsumo.Rows)
                {
                    int c = int.Parse(aa.Cells[0].Value.ToString());
                    if (c == a)
                    {
                        int d = int.Parse(aa.Cells[2].Value.ToString()) + int.Parse(Nud2_Cantidad.Value.ToString());
                        aa.Cells[2].Value = d;
                        ee++;
                    }
                }
                if (ee == 0)
                {
                    dgv_DetalleConsumo.Rows.Add(a.ToString(), cbx_RecursosFunjibles.Text.ToString(), Nud2_Cantidad.Value.ToString());
                }
                int xx = ((Recurso)cbx_RecursosFunjibles.SelectedItem).cod_recurso;
                Recurso s = BEDE.Recurso.Single(c => c.cod_recurso == xx);
                if (s.cant_disponible == 0) { Nud2_Cantidad.Value = 0; } else { Nud2_Cantidad.Value = 1; }
                cbx_RecursosFunjibles.SelectedIndex = -1;
                
            }
            if (dgv_DetalleConsumo.RowCount != 0) { btn_DescartarConsumo.Enabled = true; btn_RegistrarConsumo.Enabled = true; }
            else { btn_DescartarConsumo.Enabled = false; btn_RegistrarConsumo.Enabled = false; }
        }

        private void btn_DescartarConsumo_Click(object sender, EventArgs e)
        {
            cbx_Trabajador.SelectedIndex = -1;
            cbx_RecursosFunjibles.SelectedIndex = -1;
            Nud2_Cantidad.Value = 1;
            tbx_Observaciones.Clear();
            dgv_DetalleConsumo.Rows.Clear();
            btn_RegistrarConsumo.Enabled = false;
            btn_DescartarConsumo.Enabled = false;
        }

        private void btn_RegistrarConsumo_Click(object sender, EventArgs e)
        {
            if (dgv_DetalleConsumo.RowCount != 0)
            {
                try
                {
                    int a = g.GenComun();
                    foreach (DataGridViewRow row in dgv_DetalleConsumo.Rows)
                    {
                        Consumo C = new Consumo();
                        C.cod_consumo = g.GenCodConsumo();
                        C.fecha = DateTime.Now.Date;
                        if (tbx_Observaciones.Text != "") { C.observacion = tbx_Observaciones.Text; }
                        else { C.observacion = ""; }
                        C.cod_trabajador = ((Trabajador)cbx_Trabajador.SelectedItem).rut;
                        C.recurso = int.Parse(row.Cells[0].Value.ToString());
                        C.cant_recurso = int.Parse(row.Cells[2].Value.ToString());
                        C.comun = a;
                        BEDE.Consumo.AddObject(C);

                        Recurso r = BEDE.Recurso.Single(c => c.cod_recurso == C.recurso);
                        r.cant_disponible = r.cant_disponible - C.cant_recurso;
                        BEDE.SaveChanges();
                    }
                    dgv_DetalleConsumo.Rows.Clear();
                    cbx_Trabajador.SelectedIndex = -1;
                    cbx_RecursosFunjibles.SelectedIndex = -1;
                    Nud2_Cantidad.Value = 1;
                    tbx_Observaciones.Clear();
                    btn_DescartarConsumo.Enabled = false;
                    btn_RegistrarConsumo.Enabled = false;
                    LlenarExistencias();
                    MessageBox.Show("El consumo de recursos fue registrado", "CONSUMO REGISTRADO", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                catch { }
            }
        }

        //private void Nud2_Cantidad_Leave(object sender, EventArgs e)
        //{
        //    if (cbx_RecursosFunjibles.SelectedIndex != -1)
        //    {
        //        Recurso aux = BEDE.Recurso.Single(c => c.cod_recurso == int.Parse(cbx_RecursosFunjibles.SelectedValue.ToString()));
        //        if (Nud2_Cantidad.Value > aux.cant_disponible) { valcantidad = 0; } else { valcantidad = 1; }
        //        if (valcantidad == 0) { errorProvider1.SetError(lbl_cant, "La cantidad que intenta solicitar supera la cantidad disponible del producto."); }
        //        else { errorProvider1.SetError(lbl_cant, ""); }
        //    }
        //    else { valcantidad = 0; }
        //}
    }
}
